//
// Created by EDZ on 2022/10/20.
//

#include "ipc_fifo.h"

#include <fcntl.h> // O_WRONLY
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h> // getpid()

#include "../basic/files.h"
ssize_t func_ipc_fifo_write(const char *testFifoName) {
    int fd;
    char buf[1024];
    time_t tp;

    printf("我是 %d FIFO写入进程.\n", getpid());
    // 以写打开一个FIFO
    fd = open(testFifoName, O_WRONLY);
    if (fd < 0) {
        perror("fifo_write 打开FIFO失败");
        return 1;
    }

    ssize_t ret = 0;
    size_t n;
    for (int i = 0; i < 10; ++i) {
        time(&tp); //  获取系统时间
        n = sprintf(buf, "处理[%d]进程的时间是: %s \n", getpid(), ctime(&tp));
        printf("发送消息: %s", buf); // 打印输出
        ret = write(fd, buf, n + 2);
        if (ret < 0) // 写入到FIFO中
        {
            perror("fifo_write 写入fifo失败");
            goto fail;
        }
        sleep(1); // 休眠1秒
    }

    fail:
    close(fd);  // 关闭FIFO文件
    return ret;
}

int func_ipc_fifo_read(const char *testFifoName) {
    int ret = 0;
    int fd;
    char buf[1024];

    printf("我是 %d FIFO读取进程.\n", getpid());

    if (checkIfFileExists(testFifoName) && unlink(testFifoName) < 0) {
        perror(" fifo_read 删除FIFO失败");
        ret = 1;
        goto fail;
    }

    if (mkfifo(testFifoName, 0666) < 0) {
        perror(" fifo_read 创建FIFO失败");
        ret = 1;
        goto fail;
    }

    // 只读方式打开
    if ((fd = open(testFifoName, O_RDONLY)) < 0) {
        perror(" fifo_read 打开FIFO失败");
        ret = 1;
        close(fd);  // 关闭FIFO文件

        goto fail;
    }

    while (read(fd, buf, 1024) > 0) {
        printf("读取消息: %s", buf);
    }

fail:

    return ret;
}
